﻿using System;
using System.Text;

namespace cc.hanzs.json
{
    public class JSONArray {
        private JSONArray() {
        }

        public Object parent = null;
        private String path_s = null;
        private System.Collections.ArrayList ji集合 = null;
        private static JSONArray i_ArrayJSON = new JSONArray();

        public void set(JSONTokener x) {
            this.clear();
            if (x.nextClean() != '[') {
                throw new JSONException("JSONArray text 必需以'['开始！");
            }
            if (x.nextClean() == ']') {
                return;
            }
            x.back();
            for (;;) {
                if (x.nextClean() == ',') {
                    x.back();
                    ji集合.Add(null);
                } else {
                    x.back();
                    ji集合.Add(x.nextValue(this));
                }
                switch (x.nextClean()) {
                    case ';':
                    case ',':
                        if (x.nextClean() == ']') {
                            return;
                        }
                        x.back();
                        break;
                    case ']':
                        return;
                    default:
                        throw new JSONException("Expected a ',' or ']'");
                }
            }
        }

        public void setPath(Object root) {
            foreach (object value in ji集合)
            {
                if (value == null) {
                } else if (value is cc.hanzs.json.JSONPath) {
                    ((JSONPath) value).root = root;
                    ((JSONPath) value).i当前 = this;
                } else if (value is cc.hanzs.json.JSONObject) {
                    ((cc.hanzs.json.JSONObject) value).setPath(root);
                } else if (value is cc.hanzs.json.JSONArray) {
                    ((cc.hanzs.json.JSONArray) value).setPath(root);
                }
            }
        }

        public JSONArray set(String ci_s){
            if (ci_s == null) {
                return null;
            }
            set(JSONTokener.d副本(ci_s));
            setPath(this);
            return this;
        }

        ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        public cc.hanzs.json.JSONArray put(Object value) {
            if (value == null) {
                ji集合.Add(null);
            } else if (value is Double) {
                if (JSONObject.testValidity(value)) {
                    ji集合.Add(value);
                } else {
                    ji集合.Add(null);
                }
            } else {
                ji集合.Add(value);
            }
            return this;
        }

        public Object get(int index){
            if (index < 0 || index >= ji集合.Count)
            {
                return null;
            } else {
                int ji_i = 0;
                foreach (object value in ji集合)
                {
                    if (index.Equals(ji_i)) {
                        return value;
                    }
                    ji_i++;
                }
                return null;
            }
        }

        public Boolean getBoolean(int index) {
            Object ji_o;

            ji_o = get(index);
            if (ji_o == null) {
                return false;
            }
            if (false.Equals(ji_o)){
                return false;
            }
            else if (true.Equals(ji_o)){
                return true;
            }
            if (ji_o is String) {
                String ji_s = (String)ji_o;
                ji_s = ji_s.ToLower();
                if ("false".Equals(ji_s)){
                    return false;
                }
                else if ("true".Equals(ji_s)){
                    return true;
                }
            }
            return false;
        }

        /**
         *
         * @param key 为空时抛出错误
         * @return 返回取得的值；若key不存在，则返回空值。
         */
        public Double getDouble(int index){
            Object o = get(index);
            if (o == null){
                return 0;
            }
            if (o is int || o is Int16 || o is Int64 || o is double){
                return ((double)o);
            }
            return System.Convert.ToDouble(o);
        }


        /**
         *
         * @param key 为空时抛出错误
         * @return 返回取得的值；若key不存在，则返回空值。
         */
        public int getInt(int index){
            Object o = get(index);
            if (o == null){
                return 0;
            }
            if (o is Int32 || o is Int16 || o is Int64 || o is double){
                return ((int)o);
            }
            return System.Convert.ToInt32(o);
        }

        /**
         *
         * @param key 为空时抛出错误
         * @return 返回取得的值；若key不存在，则返回空值。
         */
        public JSONArray getJSONArray(int index){
            Object o = get(index);
            if (o == null){
                return null;
            }
            if (o is JSONArray){
                return (JSONArray)o;
            }
            return null;
        }

        /**
         *
         * @param key 为空时抛出错误
         * @return 返回取得的值；若key不存在，则返回空值。
         */
        public JSONObject getJSONObject(int index){
            Object o = get(index);
            if (o == null){
                return null;
            }
            if (o is JSONObject){
                return (JSONObject)o;
            }
            return null;
        }

        /**
         *
         * @param key 为空时抛出错误
         * @return 返回取得的值；若key不存在，则返回空值。
         */
        public Int64 getLong(int index){
            Object o = get(index);
            if (o == null){
                return 0;
            }
            if (o is Int32 || o is Int16 || o is Int64 || o is double){
                return ((Int64)o);
            }
            return System.Convert.ToInt32(o);
        }

        /**
         *
         * @param key 为空时抛出错误
         * @return 返回取得的值；若key不存在，则返回空值。
         */
        public String getString(int index){
            Object o = get(index);
            if (o == null){
                return null;
            }
            return System.Convert.ToString(o);
        }

        /**
         * @param key 文本型
         * @return 返回JSONPath型的值；若key不存在，则返回空值。
         */
        public JSONPath getPath(int index){
            Object o = get(index);
            if (o == null){
                return null;
            }
            if (o is JSONObject){
                return (JSONPath)o;
            }
            return null;
        }

        /*/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/

        public String toString(){
            clearPath();
            return toString("/");
        }

        public void clearPath() {
            if (path_s == null) {
                return;
            }
            path_s = null;

            foreach (object value in ji集合)
            {
                if (value == null) {
                } else if (value is cc.hanzs.json.JSONObject) {
                    ((cc.hanzs.json.JSONObject) value).clearPath();
                } else if (value is cc.hanzs.json.JSONArray) {
                    ((cc.hanzs.json.JSONArray) value).clearPath();
                }
            }
        }


        public String toString(String path) {
            if (path_s != null) {
                return path_s;
            }
            path_s = path;

            StringBuilder sb = new StringBuilder();
            int ji_i = 0;

            foreach (object value in ji集合)
            {
                if (sb.Length == 0) {
                    sb.Append("[");
                } else {
                    sb.Append(",");
                }

                if (value == null) {
                    sb.Append("null");
                }
                else if (path.EndsWith("/")) {
                    sb.Append(JSONObject.valueToString(value, path + ji_i));
                }
                else {
                    sb.Append(JSONObject.valueToString(value, path + "/" + ji_i));
                }
                ji_i++;
            }
            if (sb.Length > 0) {
                sb.Append("]");
                return sb.ToString();
            } else {
                return "[]";
            }
        }

        /**
         *
         * 移除自身条目及仔项内的条目，彻底清理佔用资源。用于释放
         */
        public void clear() {
            foreach (object value in ji集合)
            {
                if (value == null) {
                } else if (value is JSONArray) {
                    ((JSONArray) value).clear();
                } else if (value is JSONObject) {
                    ((JSONObject) value).clear();
                }
            }
            ji集合.Clear();
        }

        public static cc.hanzs.json.JSONArray d副本() {
            cc.hanzs.json.JSONArray jd;
            jd = (cc.hanzs.json.JSONArray)i_ArrayJSON.MemberwiseClone();
            jd.ji集合 = new System.Collections.ArrayList();
            return jd;
        }

        /**
         *
         * @param ci_s
         * @return 新的JSONArray对象，建议用此方式，加快程序运行速度
         */
        public static cc.hanzs.json.JSONArray d副本(String ci_s) {
            cc.hanzs.json.JSONArray jd;
            jd = (cc.hanzs.json.JSONArray)i_ArrayJSON.MemberwiseClone();
            jd.ji集合 = new System.Collections.ArrayList();
            if (ci_s == null) {
                return jd;
            }
            try {
                jd.set(JSONTokener.d副本(ci_s));
                jd.setPath(jd);
            } catch (JSONException) {
            }
            return jd;
        }
    }
}
